/* 矩阵乘法+快速幂+背景(多为DP，递推)
* 1.矩阵乘法
    A·B * B·I = A·C
     p  *  Q  =  R
    a中不能有变量

    for(int i = 1; i <= n; i++)
        for(int j = 1; j <= c; j++)
            for(int k = 1; k <= B; k++)
                R[i][j] += P[i][k] * Q[k][j];

* 本题:
    DP
    1.状态规划f[i][j]
        集合 所有长度为i, 且不包含s串, 且末尾部分与s的前缀匹配的长度是j的所有字符串的集合
        属性 数量
    2.状态计算
        集合划分

    F[n] = F[n-1]A = ... = F[1]A^(n-1)
*/

#define DEBUG
#pragma GCC optimize("O1,O2,O3,Ofast")
#pragma GCC optimize("no-stack-protector,unroll-loops,fast-math,inline")
#pragma GCC target("avx,avx2,fma")
#pragma GCC target("sse,sse2,sse3,sse4,sse4.1,sse4.2,ssse3")

#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

#define int long long

const int N = 25;
int n, m, mod; 
char str[N];
int ne[N];
int a[N][N];//状态转移矩阵

void print(int p[][N], int m)
{
    for(int i = 0; i < m; i++)
    {
        for(int j = 0; j < m; j++)
        {
            printf("%d ", p[i][j]);
        }
        printf("\n");
    }  
}

void mul(int c[][N], int a[][N], int b[][N])
{
    static int temp[N][N]; //static提高效率，只初始化一次，不用重复开辟空间
    memset(temp, 0, sizeof temp);
    for(int i = 0; i < m; i++)
        for(int j = 0; j < m; j++)
            for(int k = 0; k < m; k++)
                temp[i][j] = (temp[i][j] + 1ll*a[i][k]*b[k][j]) % mod;

    memcpy(c, temp, sizeof temp);

}
int qmi(int k)
{
    int f[N][N] = {1}; //只有第一行有用, f[N] = f[N-1]*a-> f[N] = F[1] * a^(N-1)
    
    while(k)
    {
        if(k&1) mul(f, f, a); // f = f * a -> res = res * a
        mul(a, a, a); // a = a * a -> base = base * base
        k >>= 1;
    }

    int res = 0;
    //在经过迭代后，此时f[0]表示长度为n(参考转移方程)
    for(int i = 0; i < m; i++) res = (res + f[0][i]) % mod;
    return res;
}

signed main()
{
    #ifdef DEBUG
        freopen("./in.txt", "r", stdin);
    #else
        ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    #endif

    cin >> n >> m >> mod;
    cin >> str+1;

    //kmp
    for(int i = 2, j = 0; i <= m; i++)
    {
        while(j && str[i] != str[j+1]) j=ne[j];
        if(str[i] == str[j+1]) j++;
        ne[i] = j;
    }

    //初始化a[i][j], 计算转移矩阵
    for(int j = 0; j < m; j++)//枚举匹配长度
        for(int c = '0'; c <= '9'; c++)//所有可能添加的字符
        {   //KMP匹配过程
            int k = j; //当前匹配长度
            while(k && str[k+1] != c) k = ne[k]; //最长前缀位置
            if(str[k+1] == c) k++; //字符匹配，则匹配到更长的前缀
            if(k < m) a[j][k]++; //状态j->状态k
        }
      
    //F[n] = F[0]*A^n  
    cout << qmi(n) << endl;
  
    return 0;
} //40
